From 12073e5a6946c2ce7ac31f5acc1b530cb2d8d995 Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Thu, 14 Jul 2011 13:22:36 +0100 Subject: [PATCH] libxl: IDL: add helper to generate references to Aggregate type members. Signed-off-by: Ian Campbell Committed-by: Ian Jackson --- tools/libxl/gentypes.py | 14 ++++---------- tools/libxl/libxltypes.py | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/tools/libxl/gentypes.py b/tools/libxl/gentypes.py index d6db145f18..8c8ffc26df 100644 --- a/tools/libxl/gentypes.py +++ b/tools/libxl/gentypes.py @@ -76,27 +76,21 @@ def libxl_C_type_define(ty, indent = ""): return s.replace("\n", "\n%s" % indent) def libxl_C_type_destroy(ty, v, indent = " ", parent = None): - if parent is None: - deref = v + "->" - else: - deref = v + "." s = "" if isinstance(ty, libxltypes.KeyedUnion): if parent is None: raise Exception("KeyedUnion type must have a parent") for f in ty.fields: + (nparent,fexpr) = ty.member(v, f, parent is None) keyvar_expr = f.keyvar_expr % (parent + ty.keyvar_name) s += "if (" + keyvar_expr + ") {\n" - s += libxl_C_type_destroy(f.type, deref + f.name, indent + " ", deref) + s += libxl_C_type_destroy(f.type, fexpr, indent + " ", nparent) s += "}\n" elif isinstance(ty, libxltypes.Struct) and (parent is None or ty.destructor_fn is None): for f in [f for f in ty.fields if not f.const]: - - if f.name is None: # Anonymous struct - s += libxl_C_type_destroy(f.type, deref, "", deref) - else: - s += libxl_C_type_destroy(f.type, deref + f.name, "", deref) + (nparent,fexpr) = ty.member(v, f, parent is None) + s += libxl_C_type_destroy(f.type, fexpr, "", nparent) else: if ty.destructor_fn is not None: s += "%s(%s);\n" % (ty.destructor_fn, ty.pass_arg(v, parent is None)) diff --git a/tools/libxl/libxltypes.py b/tools/libxl/libxltypes.py index 25430e262d..b7b46697db 100644 --- a/tools/libxl/libxltypes.py +++ b/tools/libxl/libxltypes.py @@ -147,6 +147,24 @@ class Aggregate(Type): n,t,const,comment = f self.fields.append(Field(t,n,const=const,comment=comment)) + # Returns a tuple (stem, field-expr) + # + # field-expr is a C expression for a field "f" within the struct + # "v". + # + # stem is the stem common to both "f" and any other sibbling field + # within the "v". + def member(self, v, f, isref): + if isref: + deref = v + "->" + else: + deref = v + "." + + if f.name is None: # Anonymous + return (deref, deref) + else: + return (deref, deref + f.name) + class Struct(Aggregate): def __init__(self, name, fields, **kwargs): kwargs.setdefault('passby', PASS_BY_REFERENCE) -- 2.30.2